<?php
App::uses('AppController', 'Controller');
App::uses('FileValidation', 'Lib');
App::uses('TexChange', 'Lib');
/**
 * Pagamentos Controller
 *
 * @property Pagamento $Pagamento
 */
class PagamentosController extends AppController {

	var $components = array('PagSeguro', 'EmailHandler');
	
	public function beforeFilter(){
		parent::beforeFilter();
		$this->Auth->allow('pagseguro_response', 'verificar_comprovante');
	}
		
	public function index() {
		$this->Pagamento->recursive = 0;
		$this->set('pagamentos', $this->paginate());
	}

/**
 * view method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function view($id = null) {
		if(!$this->isAdmin())
			$this->notAuth();
		if (!$this->Pagamento->exists($id)) {
			throw new NotFoundException(__('Invalid pagamento'));
		}
		$options = array('conditions' => array('Pagamento.' . $this->Pagamento->primaryKey => $id));
		$this->set('pagamento', $this->Pagamento->find('first', $options));
	}

	public function confirmar_inscricao(){
		if($this->Datas->getDataInicioInscricao() > date('Y-m-d H:i:s') || $this->Datas->getDataFimInscricao() < date('Y-m-d H:i:s') ){
			$this->Session->setFlash(__('Fora do prazo de inscrição (confirmar)'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('/pages/blank');
		}
		if ($this->request->is('post')) {
			$conflito = $this->Pagamento->CursosUsuario->Curso->conflitoDeHorario($this->request->data['CursoUsuario']['curso_id']);
			if($conflito){
				$this->Session->write('cursos_escolhidos', $this->request->data);
				$this->Session->write('conflito', $conflito);
				$this->redirect('/inscricao');
			}
			$informacoes = $this->Pagamento->informacoes($this->request->data, $this->usuarioSessao);
			//pr($informacoes);
			$this->PagSeguro->gravaInformacoes($informacoes);
		}else{
			$this->redirect('add');
		}
	}
	
	public function retornoPagSeguro($hash){
		$pagamento = $this->Session->read('Pagamento');
		$pagamento['hash'] = $hash;
		if($this->Pagamento->efetuarInscricao($pagamento, $this->usuarioSessao['Usuario']['id'])){
			$this->carregaSessao();
			$this->recarregaInscricao();
			$this->Session->setFlash(__('Aguarde a confirmação do pagamento por email. Apenas após a confirmação do pagamento sua matrícula será confirmada. Se o pagamento for cancelado pelo pagseguro, tente novamente.'), 'flash/bootstrap', array('class'=>'alert alert-success'));
			$this->redirect('/pages/blank');
		} else{
			$this->Session->setFlash(__('Não foi possível efetuar a sua inscrição! Tente novamente'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect(array('action'=>'add'));
		}
	}
	
	public function efetuar(){
		if($this->Datas->getDataInicioInscricao() > date('Y-m-d H:i:s') || $this->Datas->getDataFimInscricao() < date('Y-m-d H:i:s') ){
			$this->Session->setFlash(__('Fora do prazo de inscrição (efetuar)'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('/pages/blank');
		}
		$preco = $this->Session->read('Pagamento.valor_base');
		if(!$this->Pagamento->findByUsuarioId($this->usuarioSessao['usuario_id'])){
				$this->Pagamento->save(array('usuario_id'=>$this->usuarioSessao['usuario_id'], 'confirmado'=>false, 'valor_total'=>$preco));
				$array_produtos[] = array('id'=>$this->Pagamento->id, 'description'=>__('Inscrição Base'), 'amount'=>$preco, 'quantity'=>1);
				$produtos = $this->Session->read('Pagamento.Cursos');
				if($produtos)
					foreach ($produtos as $item){
						if($item['valor'] > 0) {
							$array_produtos[] = array('id'=>$item['id'], 'description'=>$item['descricao'], 'amount'=>$item['valor'], 'quantity'=>1);
							$preco += $item['valor'];
						}
						$array_save[] = array('usuario_id'=>$this->usuarioSessao['usuario_id'], 'curso_id'=>$item['id'], 'pagamento_id'=>$this->Pagamento->id, 'material'=>false);
					}
				$materiais = $this->Session->read('Pagamento.Materiais');
				if($materiais)
					foreach ($materiais as $item){
						if($item['valor'] > 0) {
							$array_produtos[] = array('id'=>$item['id'], 'description'=>$item['descricao'], 'amount'=>$item['valor'], 'quantity'=>1);
							$preco += $item['valor'];
						}
						$array_save[] = array('usuario_id'=>$this->usuarioSessao['usuario_id'], 'curso_id'=>$item['id'], 'pagamento_id'=>$this->Pagamento->id, 'material'=>true);
					}
				if(isset($array_save))
					$this->Pagamento->CursosUsuario->saveAll($array_save);
				$this->Pagamento->saveField('valor_total', $preco);
				$this->Session->write(
					'PaymentPlugin', array(
						'redirect_url'=>array('plugin'=>null, 'controller'=>'pagamentos', 'action'=>'retornoPagSeguro'),
						'id_field'=>'id',
						'id'=>$this->Pagamento->id,
						'model'=>'Pagamento',
						'items'=>$array_produtos
					)
				);
				$this->redirect(array('plugin'=>'payment', 'controller'=>'payment', 'action'=>'index', $this->Session->read('Auth.User.Usuario.hash')));
		}
		else { // Já existe uma inscrição
			$this->redirect('/pagamentos/ja_existe');
		}
	}
	
	public function ja_existe(){
		$this->Pagamento->bindModel(
				array('hasOne'=>
					array('PaymentPagamento'=>array(
						'className'=>'Payment.PaymentPagamento',
						'foreignKey'=>'pagamento_system_id'
					))
				)
			);
		$this->Pagamento->recursive = 2;
		$data = $this->Pagamento->findByUsuarioId($this->usuarioSessao['usuario_id']);
		$this->set('data', $data);
	}
	
	public function pagseguro_response(){
		$code = $this->request->data['notificationCode'];
		$this->autoRender = false;
		$this->layout = null;
		$notification = $this->PagSeguro->getNotificacaoAndSave($code);
		if($notification){
			$dados = $this->PagSeguro->getTransactionCodeAndInscricaoId($notification['PagseguroTransacao']['id']);
			$pagamento = $this->Pagamento->findByUsuarioId($dados['inscricao']);
			if(empty($pagamento['Pagamento']['hash'])){
				$this->Pagamento->id = $pagamento['Pagamento']['id'];
				$this->Pagamento->saveField('hash',$dados['code']);
			}
			if($notification['PagseguroTransacao']['pagseguro_status_id'] == 3){
				$this->Pagamento->id = $pagamento['Pagamento']['id'];
				$this->Pagamento->saveField('confirmado',1);
				$this->recarregaInscricao();
			}
		}
	}
	
	public function minha_inscricao(){
		if($this->usuarioSessao['Inscricao']['inscricao_feita']){
			$this->Pagamento->recursive = 2;
			$this->Pagamento->unbindModel(array('belongsTo'=>array('Usuario')));
			$inscricao = $this->Pagamento->findByUsuarioId($this->usuarioSessao['Usuario']['id']);
			$status_atual = $this->Pagamento->getStatusAtual($this->usuarioSessao['Usuario']['id']);
			$this->set('inscricao', $inscricao);
			$this->set('status', $status_atual);
		}else{
			$this->notAuth();
		}
	}

	
	public function add(){ 
		if($this->Datas->getDataInicioInscricao() > date('Y-m-d H:i:s') || $this->Datas->getDataFimInscricao() < date('Y-m-d H:i:s') ){
			$this->Session->setFlash(__('Fora do prazo de inscrição'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect('/pages/blank');
		}
		if(!$this->tenhoInscricao()){
			$this->Pagamento->bindModel(array('hasOne'=>array('PaymentPagamento'=>array('className'=>'Payment.PaymentPagamento', 'foreignKey'=>'pagamento_system_id'))));
			if($data = $this->Pagamento->findByUsuarioId($this->usuarioSessao['usuario_id'])){
				if(in_array($data['PaymentPagamento']['status_id'], $this->Pagamento->PaymentPagamento->Status->idsPagos()))
					$this->redirect('/pagamentos/minha_inscricao');
				else
					$this->redirect('/pagamentos/ja_existe');
			}
			if ($this->Session->check('Pagamento')) {
				$this->Session->delete('Pagamento');
			}
			$this->loadModel('Curso');
			$cursos = $this->Curso->find('list', array('fields'=>'nome_com_preco'));
			$cursos_com_material = $this->Curso->find('list', array('conditions'=>array('material'=>true), 'fields'=>'material_com_preco'));
			$usuario = $this->Pagamento->Usuario->findById($this->usuarioSessao['Usuario']['id']);
			$preco = $this->Pagamento->calculaPreco($usuario['Usuario']);
			if($this->Session->check('cursos_escolhidos')){
				$this->request->data = $this->Session->read('cursos_escolhidos');
				$this->set('conflito', $this->Session->read('conflito'));
				$this->Session->delete('cursos_escolhidos');
				$this->Session->delete('conflito');
			}
			if(!$preco){
				$this->Session->setFlash(__('Você não pode fazer inscrição ainda! Aguarde o período de inscrição'), 'flash/bootstrap', array('class'=>'alert alert-block'));
				$this->redirect('/pages/blank');
			}
			$this->set(compact('cursos', 'preco', 'cursos_com_material'));
		}
		else $this->notAuth();
	}

/**
 * edit method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function edit($id = null) {
		if(!$this->isAdmin())
			$this->notAuth();
		if (!$this->Pagamento->exists($id)) {
			throw new NotFoundException(__('Invalid pagamento'));
		}
		if ($this->request->is('post') || $this->request->is('put')) {
			if ($this->Pagamento->save($this->request->data)) {
				$this->Session->setFlash(__('The pagamento has been saved'));
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('The pagamento could not be saved. Please, try again.'));
			}
		} else {
			$options = array('conditions' => array('Pagamento.' . $this->Pagamento->primaryKey => $id));
			$this->request->data = $this->Pagamento->find('first', $options);
		}
		$users = $this->Pagamento->Usuario->find('list');
		$this->set(compact('users'));
	}

/**
 * delete method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function delete($id = null) {
		if(!$this->isAdmin())
			$this->notAuth();
		$this->Pagamento->id = $id;
		if (!$this->Pagamento->exists()) {
			throw new NotFoundException(__('Inscrição inválida !'));
		}
		$this->request->onlyAllow('post', 'delete');
		$this->Pagamento->unbindModel(array('belongsTo'=>array('Usuario')));
		if ($this->Pagamento->delete()) {
			$this->Session->setFlash(__('A inscrição foi removida.'), 'flash/bootstrap', array('class'=>'alert alert-success'));
			$this->redirect(array('controller' => 'usuarios', 'action' => 'index'));
		}
		$this->Session->setFlash(__('Erro ao tentar remover a inscrição.'), 'flash/bootstrap', array('class'=>'alert alert-error'));
		$this->redirect(array('controller' => 'usuarios', 'action' => 'index'));
	}
	
	public function pagamentos_forma_pagamento(){
		$this->Pagamento->unbindModel(array('hasMany'=>array('CursosUsuario')));
		$dados = $this->Pagamento->formas_de_pagamento();
		$this->loadModel('PagseguroFormasPagamento');
		$this->set('formas', $this->PagseguroFormasPagamento->find('list'));
		$this->set('dados', $dados);
	}
	
	public function cancelar($id_pagamento){
		$pagamento = $this->Pagamento->findById($id_pagamento);
		if($pagamento && $pagamento['Pagamento']['usuario_id'] == $this->usuarioSessao['Usuario']['id']){
			$this->Pagamento->id = $pagamento['Pagamento']['id'];
			if($this->Pagamento->delete()){
				$this->Session->setFlash(__('Pagamento cancelado'), 'flash/bootstrap', array('class'=>'alert alert-success'));
				$this->redirect(array('controller' => 'pagamentos', 'action' => 'add'));
			}
		}
		else{
			$this->notAuth();
		}
		
	}
	
	public function comprovante_de_pagamento(){
		$inscricao = $this->Pagamento->findByUsuarioId($this->usuarioSessao['Usuario']['id']);
		$status_atual = $this->Pagamento->getStatusAtual($this->usuarioSessao['Usuario']['id']);
		$this->loadModel('Payment.PaymentStatus');
		if(isset($status_atual['PaymentPagamento']) && in_array($status_atual['PaymentPagamento']['status_id'], $this->PaymentStatus->idsPagos())){
			$fileVal = new FileValidation(FILE_VALIDATION_APPID, FILE_VALIDATION_HASH);
			if($inscricao['Pagamento']['comprovante'] == NULL){
				$this->loadModel('Data');
				$data_inicio = $this->Data->getData('inicio_evento');
				$data_final = $this->Data->getData('fim_evento');
				$texChange = new TexChange();
				$file = $texChange->changeTexPagamento(
					APP.'Comprovantes'.DS.'comprovante-pagamento.tex',
					$this->usuarioSessao['Usuario']['nome'],
					$inscricao['Pagamento']['valor_total'],
					$this->Session->read('config.nome_evento'),
					$this->Session->read('config.local_evento'),
					$data_inicio,
					$data_final,
					$this->Session->read('config.tesoureiro'),
					$this->usuarioSessao['Usuario']['id']
				);
				$response = $fileVal->sendFile($file);
				unlink($file);
				if($response['status'] == 'OK'){
					$this->Pagamento->id = $inscricao['Pagamento']['id'];
					$this->Pagamento->saveField('comprovante', $response['message']);
					$this->redirect('comprovante_de_pagamento');
				}
				else{
					$this->log('FILE VALIDATION: '.$response['message']);
					echo $this->Session->setFlash(__('Erro ao gerar seu comprovante! Por favor, entre em contato com a administração'), 'flash/bootstrap', array('class'=>'alert alert-error'));
					$this->redirect('minha_inscricao');
				}				
			}
			else{
				$file = $fileVal->getFile($inscricao['Pagamento']['comprovante']);
				$this->response->body($file);
			    $this->response->type('pdf');
			
			    //Optionally force file download
			    $this->response->download('Comprovante-'.$this->usuarioSessao['id'].'.pdf');
			
			    // Return response object to prevent controller from trying to render
			    // a view
			    return $this->response;
			}
		}
		else{
			echo $this->Session->setFlash(__('A sua inscrição nao foi confirmada ainda!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect(array('controller'=>'usuarios', 'action'=>'comprovantes'));
		}
	}
	
	public function verificar_comprovante(){
		if(!empty($this->request->data)){
			$fileVal = new FileValidation(FILE_VALIDATION_APPID, FILE_VALIDATION_HASH);
			$return = $fileVal->getFile($this->request->data['hash']);
			$objeto = json_decode($return, true);
			if($objeto['status'] != 'ERROR'){
				$this->response->body($return);
			    $this->response->type('pdf');
			    $this->response->download('Comprovante.pdf');
			    return $this->response;
			}
			else{
				$this->Session->setFlash(__('Comprovante inválido'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			}
		}
	}
	
	public function marcar_como_pago($usuario_id){
		if($this->isAdmin()){
			$this->loadModel('Payment.PaymentPagamento');
			if(!empty($this->request->data)){
				$this->request->data['Pagamento']['confirmado'] = 1;
				$this->request->data['Pagamento']['hash'] = 'MANUAL';
				if($this->Pagamento->save($this->request->data)){
					$to_save = array('model_pagamento'=>'Pagamento',
							'pagamento_system_id'=>$this->Pagamento->id,
							'payment_gateway_id'=>0,
							'transaction_code'=>'MANUAL',
							'primary_payment_method_id'=>$this->request->data['Pagamento']['metodo_pagamento'],
							'status_id'=>4,
							'value'=>$this->request->data['Pagamento']['valor_total']
					);
					$this->PaymentPagamento->save($to_save);
					$this->Session->setFlash(__('Pagamento confirmado com sucesso!'), 'flash/bootstrap', array('class'=>'alert alert-success'));
					$this->redirect(array('controller' => 'usuarios', 'action' => 'cadastrar_curso', $usuario_id));
				}
				else{
					$this->Session->setFlash(__('Problema ao salvar! Tente novamente'));
				}
				
			}
			else{
				$pagamento = $this->Pagamento->findByUsuarioId($usuario_id);
				if($pagamento){
					$this->Session->setFlash(__('Usuário já pagou, ou com tentativa de pagamento iniciada!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
					$this->redirect("/");
				}
			}
			$this->set('usuario_id', $usuario_id);
			$this->set('metodo_pagamento', $this->PaymentPagamento->PrimaryPaymentMethod->find('list', array('conditions'=>array('parent_id'=>0))));
		}
	}
}
